﻿using System;
using System.Linq;
using GDM.Hogar.Aplicacion.Properties;
using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;

namespace GDM.Hogar.Aplicacion.Formularios.ParteQuincenalPersonal
{
    public partial class FrmConsultaParteQuincenalPersonal
#if DEBUG
 : FrmConsultaPartesQuincenalPersonal
#else
     : FrmConsulta<ConsultaParteQuincenalPersonal>
#endif
    {
        private readonly IParteQuincenalPersonalManager _parteQuincenalPersonalManager;
        private FrmParteQuincenalPersonal _frmCrearParteQuincenalPersonal;
        private FrmParteQuincenalPersonal _frmEditarParteQuincenalPersonal;

        private Reportes.FrmParteQuincenalPersonal _frmReporteParteQuincenalPersonal;

        private bool EsAdministrativo
        {
            get { return ContextoUsuario.RolId == (int)Rol.Administrativo; }
        }

        #region Public Methods

        public FrmConsultaParteQuincenalPersonal(IParteQuincenalPersonalManager parteQuincenalPersonalManager)
        {
            if (parteQuincenalPersonalManager == null)
                throw new ArgumentNullException("parteQuincenalPersonalManager");

            _parteQuincenalPersonalManager = parteQuincenalPersonalManager;
            InitializeComponent();
        }

        #endregion Public Methods

        protected override void EliminarRegistro(ConsultaParteQuincenalPersonal parteQuincenalPersonal)
        {
            try
            {
                //- desactivar parte quincenal en bd
                _parteQuincenalPersonalManager.ActivarParteDiarioPersonal(parteQuincenalPersonal.ParteDiarioPersonalId, false);
                Datos.First(p => p.ParteDiarioPersonalId == parteQuincenalPersonal.ParteDiarioPersonalId).Activo = false;
                RefrescarParteQuincenal();
                MostrarMensajeExito(Resources.ParteQuincenal_EliminadoConExito);
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.EliminarParteQuincenal_Error);
            }
        }

        protected override void CrearRegistro()
        {
            _frmCrearParteQuincenalPersonal = AbrirFormularioModal(_frmCrearParteQuincenalPersonal, action: frm => frm.OnParteQuincenalCreado = RefrescarParteQuincenal);
        }

        protected override void EditarRegistro(ConsultaParteQuincenalPersonal parteDiarioPersonal)
        {
            var partesDiarioPersonal = Datos.Where(x => x.AgenteId == parteDiarioPersonal.AgenteId);
            _frmEditarParteQuincenalPersonal = AbrirFormularioModal(_frmEditarParteQuincenalPersonal, action: frm =>
            {
                frm.PartesDiarioPersonal = partesDiarioPersonal;
                frm.OnParteQuincenalActualizado = RefrescarParteQuincenal;
            });
        }

        private void SetearFechaActual()
        {
            var fechaActual = DateTime.Now;
            cmbMes.SelectedIndex = fechaActual.Month - 1;
            cmbAño.SelectedIndex = cmbAño.FindStringExact(fechaActual.Year.ToString(), 0);
        }

        private void FrmConsultaParteQuincenalPersonal_Load(object sender, EventArgs e)
        {
            CargarAñosCalendario();
            SetearFechaActual();
            ttInfo.SetToolTip(btnQuitarFiltro, "Quitar filtro");
            dgParteQuincenalPersonal.UserCanAdd = EsAdministrativo;
            dgParteQuincenalPersonal.ReadOnlyMode = !EsAdministrativo;
            dgParteQuincenalPersonal.UserCanDelete = true;
            btnBuscar_Click(null, null);
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            _frmReporteParteQuincenalPersonal = AbrirFormularioModal(_frmReporteParteQuincenalPersonal, action: frm => frm.Datos = Datos);
        }

        private void btnQuitarFiltro_Click(object sender, EventArgs e)
        {
            LimpiarControl(gbFiltros);
            SetearFechaActual();
            rb1erQuincena.Checked = true;
            btnBuscar_Click(null, null);
        }

        private void RefrescarParteQuincenal()
        {
            btnBuscar_Click(null,null);
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            if (!parteQuincenalPersonalValidador.Validate()) return;

            CargarParteQuincenalPersonal();
        }

        private void FormatearDatosParteQuincenal()
        {
            var idAgenteActual = 0;
            foreach (var parteDiario in Datos)
            {
                if (parteDiario.AgenteId == idAgenteActual)
                {
                    parteDiario.Apellido = "";
                    parteDiario.Nombre = "";
                    parteDiario.Dni = "";
                    parteDiario.CatCar = "";
                }
                else
                {
                    idAgenteActual = parteDiario.AgenteId;
                }
            }
        }

        private void CargarParteQuincenalPersonal()
        {
            var año = (int)cmbAño.SelectedItem;
            var mes = cmbMes.SelectedIndex + 1;
            var quincena = rb2daQuincena.Checked ? 2 : 1;
            Datos = _parteQuincenalPersonalManager.ObtenerTodosPorMesQuincena(mes, año, quincena);
            Datos = Datos.GroupBy(x => x.AgenteId)
                 .Select(g => new {partes = g.OrderBy(x => x.FechaAComparar)})
                 .SelectMany(x => x.partes).ToList();
            FormatearDatosParteQuincenal();
            InicializarGrilla(dgParteQuincenalPersonal);
        }

        private void parteQuincenalPersonalValidador_CustomValidation(object sender, Controles.Validador.Componentes.ValidationEventArgs e)
        {
            if (e.Control == cmbMes)
            {
                e.Valid = cmbMes.SelectedIndex >= 0;
            }
            if (e.Control == cmbAño)
            {
                e.Valid = cmbAño.SelectedIndex >= 0;
            }
        }

        private void CargarAñosCalendario()
        {
            for (var i = DateTime.Now.Year - 3; i <= DateTime.Now.Year; i++)
            {
                cmbAño.Items.Add(i);
            }
        }
    }
}